package com.twq.func.innerctrl

import java.io.File

/**
 * Created by tangweiqun on 2017/11/28.
 */
object For {
  def main(args: Array[String]): Unit = {
    //1、用for表达式迭代一个集合
    val filesHere = (new java.io.File(".")).listFiles
    for (file <- filesHere)
      println(file)

    // Not common in Scala...
    for (i <- 0 to filesHere.length - 1)
      println(filesHere(i))

    //for表达式可以迭代任何类型的集合
    for (i <- 1 to 4)
      println("Iteration " + i)
    for (i <- List(1, 2, 3))
      println("Iteration " + i)

    //2、for表达式中的过滤
    for (file <- filesHere if file.getName.endsWith(".scala"))
      println(file)
    //可以放多个过滤条件
    for (
      file <- filesHere
      if file.isFile
      if file.getName.endsWith(".scala")
    ) println(file)

    //3、嵌套迭代(nested iteration)
    def grep(pattern: String) =
      for (
        file <- filesHere
        if file.getName.endsWith(".scala");
        line <- fileLines(file)
        if line.trim.matches(pattern)
      ) println(file + ": " + line.trim)

    grep(".*object.*")

    //可以在迭代的过程中，绑定中间值到一个变量
    //上面的()可以换成{}，这样每一个语句后面的分号就可以省略
    def grepBindValue(pattern: String) =
      for {
        file <- filesHere
        if file.getName.endsWith(".scala")
        line <- fileLines(file)
        trimmed = line.trim
        if trimmed.matches(pattern)
      } println(file + ": " + trimmed)

    grepBindValue(".*object.*")

    //4、for ... yield ... 可以生成一个新的集合
    //返回的是Array，是因为filesHere的类型是Array
    def scalaFiles: Array[File] =
      for {
        file <- filesHere
        if file.getName.endsWith(".scala")
      } yield file

    val forLineLengths: List[Int] =
      for {
        file <- filesHere.toList
        if file.getName.endsWith(".scala")
        line <- fileLines(file)
        trimmed = line.trim
        if trimmed.matches(".*object.*")
      } yield trimmed.length

  }

  def fileLines(file: java.io.File) =
    scala.io.Source.fromFile(file).getLines().toList
}
